export default {
  // 为当前模块开启命名空间
  namespaced: true,
  // 模块的 state 数据
  state: () => ({
    // 购物车数组，用来存储购物车中每个商品的信息
    cart: JSON.parse(uni.getStorageSync('cart') || '[]'),
  }),
  // 模块的 mutations 方法
  mutations: {
    saveToStorage(state) {
      uni.setStorageSync('cart', JSON.stringify(state.cart))
    },
    // #1 准备一个加入购物车的方法
    addToCart(state, goods) {
      // 如果说 goods.goods_id 在 state.cart 中能找到，只需要把找到的这个对象 goods_count + 1
      const item = state.cart.find(item => item.goods_id === goods.goods_id)
      if (item) {
        item.goods_count += 1
      } else {
        // 如果没找到，直接 push 到 state.cart
        state.cart.push(goods)
      }
      // 持久化到本地
      this.commit('m_cart/saveToStorage')
    },
    // #4 定义修改状态的 mutation
    updateGoodsState(state, goods) {
      const res = state.cart.find(item => item.goods_id === goods.goods_id)
      if (res) {
        // 修改 vuex 中的数据
        res.goods_state = goods.goods_state
        // 并把修改后的结果同步到本地
        this.commit('m_cart/saveToStorage')
      }
    },
    // #5 准备对应的修改状态的方法
    updateGoodsCount(state, goods) {
      const res = state.cart.find(item => item.goods_id === goods.goods_id)
      if (res) {
        // 修改 vuex 中的数据
        res.goods_count = goods.goods_count
        // 并把修改后的结果同步到本地
        this.commit('m_cart/saveToStorage')
      }
    },
    deleteGoods(state, goods) {
      state.cart = state.cart.filter(item => item.goods_id !== goods.goods_id)
      // 并把修改后的结果同步到本地
      this.commit('m_cart/saveToStorage')
    },
    // 点击全选修改每一个单选
    updateAllGoodsState(state, goodState) {
      state.cart.forEach(item => item.goods_state = goodState)
      // 并把修改后的结果同步到本地
      this.commit('m_cart/saveToStorage')
    }
  },
  // 模块的 getters 属性
  getters: {
    // #1 全局的计算属性，计算数量
    total(state) {
      return state.cart.reduce((acc, cur) => acc + cur.goods_count, 0)
    },
    checkedCount(state) {
      // 选中的数量
      // 先找选中的 => 在同一每一个的 goods_count
      return state.cart.filter(item => item.goods_state).reduce((acc, cur) => acc + cur.goods_count, 0)
    },
    // 选中的价钱
    checkedGoodsAmount(state) {
      return state.cart.filter(item => item.goods_state).reduce((acc, cur) => acc + cur.goods_count * cur.goods_price,
        0)
    }
  },
}
